
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>13、Spring的定时任务与调度 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>13、Spring的定时任务与调度 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Spring框架提供了哪几种主要的定时任务实现方式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring提供了三种主要的定时任务实现方式：基于注解的方式（如 @Scheduled）、编程方式（如使用 TaskScheduler 接口）、以及与第三方库（如 Quartz）集成以支持更复杂的调度需求。</div>
          </div>
          <div class="card-source">来源: 1. Spring 定时任务与调度的概述</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Spring定时任务的核心组件是什么？它们之间是什么关系？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">核心组件是 TaskScheduler 接口和 @Scheduled 注解。TaskScheduler 接口定义了调度任务的通用方法，而其默认实现类 ThreadPoolTaskScheduler 通过线程池来异步执行任务。@Scheduled 注解则是一种简化定时任务配置的声明式方法。</div>
          </div>
          <div class="card-source">来源: 2. Spring 定时任务的核心组件</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">@Scheduled注解提供了哪三种配置任务执行周期的方式？请分别说明。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">它提供了三种配置方式：1. cron：通过Cron表达式指定任务的执行时间，适用于复杂的调度需求。2. fixedDelay：指定上一次任务执行完毕后，延迟一个固定的时间再执行下一次。3. fixedRate：指定任务的执行频率，按固定的时间间隔来执行任务。</div>
          </div>
          <div class="card-source">来源: 3. 使用 @Scheduled 注解实现定时任务</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在Spring中，`ScheduledAnnotationBeanPostProcessor` 这个类扮演了什么关键角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">该类是处理 @Scheduled 注解的核心。在Spring应用启动时，它会扫描所有的Bean，找出被 @Scheduled 注解标记的方法，并通过反射动态地将这些方法注册为定时任务，交由 TaskScheduler 进行调度管理。</div>
          </div>
          <div class="card-source">来源: 4. ScheduledAnnotationBeanPostProcessor 的作用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">一个标准的Cron表达式由哪六个字段组成，分别代表什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">一个标准的Cron表达式由六个字段组成，从左到右依次是：秒（0-59）、分钟（0-59）、小时（0-23）、月中的天（1-31）、月份（1-12）、以及周中的天（0-7，其中0和7都代表星期日）。</div>
          </div>
          <div class="card-source">来源: 5. 使用 Cron 表达式进行复杂调度</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">如何为Spring的定时任务配置一个自定义的线程池以支持多任务并行执行？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以通过配置一个TaskScheduler类型的Bean来实现。通常是创建一个ThreadPoolTaskScheduler实例，并对其进行配置，例如通过 `setPoolSize()` 方法设置线程池大小，以及通过 `setThreadNamePrefix()` 设置线程名前缀。</div>
          </div>
          <div class="card-source">来源: 6. 任务执行的多线程支持</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Spring提供的默认 `TaskScheduler` 实现类是什么？它有什么主要特点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring提供的默认实现是 `ThreadPoolTaskScheduler`。它的主要特点是采用线程池的方式来调度任务，从而支持高效、异步的定时任务执行。</div>
          </div>
          <div class="card-source">来源: 2. Spring 定时任务的核心组件</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Spring应用是如何发现并自动注册被 `@Scheduled` 注解标记的方法的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当应用启动时，Spring容器中的 `ScheduledAnnotationBeanPostProcessor` 会自动扫描带有 `@Scheduled` 注解的任务。一旦发现，它就会自动注册并管理这些定时任务，使其按照注解中定义的规则执行。</div>
          </div>
          <div class="card-source">来源: 3. 使用 @Scheduled 注解实现定时任务</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当需要满足企业级高度可配置的任务调度需求时，文档推荐与哪个框架集成？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档推荐与 `Quartz` 框架进行集成。Spring提供了对 `Quartz` 的集成支持，通过配置 `SchedulerFactoryBean` 等组件，可以实现比Spring原生调度更灵活、更复杂的任务调度功能。</div>
          </div>
          <div class="card-source">来源: 8. Quartz 与 Spring 定时任务的集成</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
